# 修改数位
# 2025/5/15

def change_cost(inp: str):
    # check_map = {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0}
    check_list = [0] * 10
    n = len(inp)
    if n < 10:  # 不满足条件
        return -1
    min_cost = float('inf')
    start, end = 0, 9  # 窗口
    while end < n:
        sub_str = inp[start: end + 1]  # 窗口截取的子串
        if start == 0:  # 第一次汇总时需要检查窗口中的所有子串
            for i in range(10):  # 检查窗口中的每个字符, 将每个字符出现的次数汇总在check_list
                check_list[int(sub_str[i])] += 1
        else:  # 非第一次汇总只需要首个元素的个数减1, 并为end元素的次数加1即可
            check_list[int(inp[start - 1])] -= 1
            check_list[int(inp[end])] += 1

        # 检查check_list, 将出现次数不为1的数字汇总在lack中, 将次数超过1的部分汇总在exceed中(保留1个)
        # 如果出现的次数n为0, 就添加一个该数字, 如果出现的次数n大于1,就添加n-1个该数字
        # 如: 1出现0次, 2出现3次, 3出现0次那么need_change=[1,2,2,3]
        lack = []
        exceed = []
        for i in range(10):
            if check_list[i] == 0:
                lack.append(i)
            if check_list[i] > 1:
                for j in range(check_list[i] - 1):
                    exceed.append(i)

        # 如果lack为空,则不需要调整,直接返回0
        if len(lack) == 0:
            return 0

        # 计算花费
        cost = 0
        for i in range(len(lack)):
            cost += abs(lack[i] - exceed[i])
        # 汇总最小花费
        min_cost = min(cost, min_cost)

        # 进行下一轮
        start += 1
        end += 1

    return min_cost


if __name__ == '__main__':
    # inp = input()  # 123456789301 修改第二个3为2, 花费为1, 可以保证后10位满足条件
    # print(change_cost(inp))
    print(change_cost("99999999999999"))  # 45
